from typing import Optional

from lagent.actions.base_action import BaseAction, tool_api
from lagent.actions.parser import BaseParser
from lagent.schema import ActionReturn, ActionStatusCode, ActionValidCode


class InvalidAction(BaseAction):
    """
    无效动作类，用于在动作无效时返回错误信息。
    
    Args:
        err_msg: 错误信息，默认为'动作无效，请检查动作名称'
    """

    def __init__(self,
                 err_msg: str = 'The action is invalid, please check the action name.',
                 description: Optional[dict] = None,
                 parser=BaseParser) -> None:
        super().__init__(description, parser)
        self._err_msg = err_msg

    @tool_api
    def run(self, err_msg: Optional[str] = None) -> ActionReturn:
        """
        返回错误信息。

        Args:
            err_msg: 自定义错误信息，如果为 None 则使用默认错误信息
        """
        action_return = ActionReturn(
            url=None,
            args=dict(text=err_msg),
            errmsg=err_msg or self._err_msg,  # 使用自定义或默认错误信息
            type=self.name,
            valid=ActionValidCode.INVALID,  # 标记为无效动作
            state=ActionStatusCode.API_ERROR  # 标记为 API 错误
        )
        return action_return


class NoAction(BaseAction):
    """
    空动作类，用于在响应格式不正确时返回错误信息。
    
    Args:
        err_msg: 错误信息，默认为'请遵循格式要求'
    """

    def __init__(self,
                 err_msg: str = 'Please follow the format',
                 description: Optional[dict] = None,
                 parser=BaseParser):
        super().__init__(description, parser)
        self._err_msg = err_msg

    @tool_api
    def run(self, err_msg: Optional[str] = None) -> ActionReturn:
        """
        返回错误信息。

        Args:
            err_msg: 自定义错误信息，如果为 None 则使用默认错误信息

        Returns:
            ActionReturn: 动作执行结果
        """
        action_return = ActionReturn(
            url=None,
            args=dict(text=err_msg),
            type=self.name,
            errmsg=err_msg or self._err_msg,  # 使用自定义或默认错误信息
            valid=ActionValidCode.INVALID,  # 标记为无效动作
            state=ActionStatusCode.API_ERROR  # 标记为 API 错误
        )
        return action_return


class FinishAction(BaseAction):
    """
    完成动作类，用于返回最终结果。
    """

    def __init__(self, description: Optional[dict] = None, parser=BaseParser):
        super().__init__(description, parser)

    @tool_api
    def run(self, response: str) -> ActionReturn:
        """
        返回最终结果。

        Args:
            response: 最终结果文本

        Returns:
            ActionReturn: 动作执行结果
        """
        action_return = ActionReturn(
            url=None,
            args=dict(text=response),
            result=[dict(type='text', content=response)],  # 格式化结果
            type=self.name,
            valid=ActionValidCode.FINISH,  # 标记为完成状态
            state=ActionStatusCode.SUCCESS  # 标记为成功状态
        )
        return action_return
